﻿package com.rongji.dfish.demo.editor.service.uiadaptor;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 视图适配器的抽象类，这里将适配器通用的方法实现
 * @author DFish Team
 * @version 1.2.20160816
 *
 */
public abstract class TypeAdaptor  {
	
	/********************↓适配器定义相关↓********************/
	protected String typeName;

	
	/**
	 * 取得该适配器对应的组件名字
	 * 一般实际存在的组件以组件本身类名简称为准
	 * 而扩展的属性如Event String等则以扩展概念名为准
	 * @return String
	 */
	public String getTypeName() {
		return typeName;
	}


	
	
	/**
	 * 根据组件的数据创建此原型实例
	 * @param data 组件数据
	 * @param parent 父对象
	 * @return 实例
	 */
	public abstract Object newInstance(ComponentData data, Object parent);
 
	

	
    /**
     * 获取属性定义映射
     * @return Map
     */
	public Map<String, PropertyDefine> getDefinePropMap() {
		Map<String, PropertyDefine> propTypes = new HashMap<String, PropertyDefine>();
		List<PropertyDefine> propDefines = getDefineProps();
		for (PropertyDefine propDefine : propDefines) {
			propTypes.put(propDefine.getName(), propDefine);
		}
		return propTypes;
	}
	/**
	 * 取得属性定义
	 * @return List
	 */
	public abstract List<PropertyDefine>getDefineProps();
	


	
	

	

	

	

	
//	/**
//	 * 拼接拓展属性方法的Java代码
//	 * @param sb 拼接的字符串
//	 * @param extProps 拼接拓展属性方法的所有属性
//	 * @param br 是否换行
//	 */
//	protected void fillExtPropMethodCode(StringBuilder sb, Map<String, String> extProps, boolean br) {
//		
//	}
	
//	/**
//	 * 拼接多参方法的Java代码
//	 * @param sb 拼接的字符串
//	 * @param propGroups 拼接方法的参数组
//	 * @param propDefines 属性定义
//	 * @param br 是否换行
//	 */
//	protected void fillMultivaluedMethodCode(StringBuilder sb, Map<String, Map<String, String>> propGroups, Map<String, PropertyDefine> propDefines, boolean br) {
//		// 默认没有多值方法
//	}
	/********************↑构建视图相关↑********************/

//	/**
//	 * 取得需要展现在下架节点界面上的属性
//	 * 比如GridLayout 允许在某行某列插入内容，
//	 * 如果一个节点增加在GridLayout中，gridLayout就要通知该节点编辑的时候需要指定第几行第几列的属性。
//	 * @param nodeType String
//	 * @return List
//	 */
//	public abstract List<PropertyDefine> getProps4Child(String nodeType);

	/**
	 * 获取实例化代码
	 * @param variable String 变量名变量名会根据当前整个实体内是否重名进行补充，比如说当前有两个GridLayout
	 * 可能其中一个叫gridLayout 另一个叫gridLayout2
	 * @param data ComponentData
	 * @param javaCode StringBuilder
	 */
	public abstract void getInstanceCode(StringBuilder javaCode, ComponentData data,String variable);




	
}
